package 纯字符串;

public class No125验证回文串 {

    /**
     * 给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
     * 说明：本题中，我们将空字符串定义为有效的回文串。
     *
     * 示例 1:
     * 输入: "A man, a plan, a canal: Panama"
     * 输出: true
     * 示例 2:
     * 输入: "race a car"
     * 输出: false
     */

    //只考虑字母和数字,直接双指针
    public boolean isPalindrome(String s) {

        if(s==null){
            return false;
        }
        if(s.equals("")||s.equals(" ")){
            return true;
        }

        char[] arr=s.toCharArray();
        int left=0;
        int right=s.length()-1;
        char l;
        char r;

        while (left<=right){

            l=arr[left];
            r=arr[right];
            if(isOkChar(l)&&isOkChar(r)){
                if(!isEquals(l,r)){
                    return false;
                }
                left++;
                right--;
                continue;
            }

            //开始更新左右指针的数值

            while (left+1<=right&&!isOkChar(l)){
                left++;
                l=arr[left];
            }

            while (left<=right-1&&!isOkChar(r)){
                right--;
                r=arr[right];
            }

            if(!isEquals(l,r)){
                return false;
            }

            left++;
            right--;

        }

        return true;
    }

    private boolean isOkChar(char c){
        return Character.isLetter(c)||Character.isDigit(c);
    }

    private boolean isEquals(char c1,char c2){
        return Character.toLowerCase(c1)==Character.toLowerCase(c2);
    }

    public static void main(String[] args) {
        No125验证回文串 n=new No125验证回文串();
        boolean result = n.isPalindrome("A man, a plan, a canal: Panama");
        System.out.println(result);
    }

}
